package com.study.javaBasic.codeblock;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.openjdk.jmh.runner.options.TimeValue;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * 执行顺序：
 *  静态代码块
 *  构造代码块
 *  构造方法
 *  方法
 * 普通代码块
 */
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
public class CodeBlock {

    /**
     * 静态代码块
     * 父类构造方法
     * 构造方法
     * 参数声明
     * 代码块
     * 构造方法其他代码
     * 调用方法
     * 方法内代码块和方法内代码按顺序执行,方法内的代码块声明的变量外侧不能使用
     */
    private Test map=new Test();
    static {
        System.out.println("静态代码块");
    }
    {
        System.out.println("代码块");
    }
    public CodeBlock(){
        System.out.println("构造方法");
    }

    @Benchmark
    public void measureName(Blackhole bh) {
        CodeBlock codeBlock =new CodeBlock();
        codeBlock.test();
    }

    public void test(){
        System.out.println("方法");
        int a=1;
        System.out.println("a = " + a);
        {
            System.out.println("方法内代码块");
            a=2;
            System.out.println("a = " + a);
        }
        a=3;
        System.out.println("a = " + a);
    }

    public static void main(String[] args) throws RunnerException {
        final Options opts = new OptionsBuilder()
                .include(CodeBlock.class.getSimpleName())
                .forks(1)
                .measurementIterations(5)
                .measurementTime(TimeValue.microseconds(1000000L))
                .warmupIterations(3)
                .warmupTime(TimeValue.microseconds(1000000L))
                .build();
        new Runner(opts).run();
    }

}

class Test{
    Test(){
        System.out.println("参数声明");
    }
}
